# -*- coding:utf-8 -*-

from __future__ import unicode_literals

from collections import OrderedDict
from datetime import date

from flask import render_template, request, redirect, url_for, session, flash

from login_manager import login_required
from modelos import Professor, Disciplina, Aluno, AlunoDisciplina, Aula, AlunoAula, Atividade

from __init__ import app

#mostra a lista de disciplinas, a lista de alunos vinulados e as aulas cadastradas 
@app.route("/ver_disciplina/<int:id>")
@login_required
def ver_disciplina(id):

    p = Professor.get(Professor.id == session["user_id"])

    disciplina = Disciplina.get(Disciplina.id == id, Disciplina.professor == p)

    todos_alunos = Aluno.select().order_by(Aluno.nome)

    vinculados_alunos = Aluno.select().join(AlunoDisciplina).join(Disciplina).where(Disciplina.id == id)

    nao_vinculados_alunos = [a for a in todos_alunos if not a in vinculados_alunos]

    atividades = Atividade.select().where(Atividade.disciplina == disciplina).order_by(Atividade.tipo)

    lista_de_atividade = []
    for a in atividades:
        lista_de_atividade.append(a)
    
    # Retorna as aulas e alunos agrupado por data
    aulas = Aula.select().where(Aula.disciplina == disciplina)
    
    
    aluno_aula = AlunoAula.select().where(AlunoAula.disciplina == disciplina)

    lista_de_aula = []
    for a in aulas:
        d = {}
        d['data'] = a.data
        d['id'] = a.id
        lista_de_aula.append(d)

    chamada = OrderedDict()

    # Marca os alunos presentes
    for a in aluno_aula:
        if not chamada.has_key(a.aluno.nome):
            # TODO: Ordenar dicionario interno pela data (chave)
            chamada[a.aluno.nome] = {'id': a.aluno.id, 'chamada': OrderedDict({'%s' % a.aula.data: 'ok'})}
        else:
            chamada[a.aluno.nome]['chamada']['%s' % a.aula.data] =  'ok'

    # Marca os que faltaram
    for data in lista_de_aula:
        for aluno in chamada.keys():
            if not chamada[aluno]['chamada'].has_key(data['data']):
                chamada[aluno]['chamada'][data['data']] = '-'

    # Lança falta para alunos vinculados que não vieram nenhuma vez anteriormente.
    for va in vinculados_alunos:
        if not chamada.has_key(va.nome):
            chamada[va.nome] = {'id': va.id, 'chamada': OrderedDict([ (x['data'], '-') for x in lista_de_aula ])}

    # Ordena as Chamadas
    for a in chamada:
        chamada[a]['chamada'] = OrderedDict(sorted(chamada[a]['chamada'].items(), key=lambda k: date(day=int(k[0].split("/")[0]), month=int(k[0].split("/")[1]), year=1000)))

    # Ordena o Cabeçalho
    lista_de_aula = sorted(lista_de_aula, key=lambda k: date(day=int(k['data'].split("/")[0]), month=int(k['data'].split("/")[1]), year=1000)) 

    # Ordena os nomes
    chamada = OrderedDict(sorted(chamada.items(), key=lambda k: k))

    return render_template("ver_disciplina.html", 
        disciplina=disciplina, 
        atividades=lista_de_atividade,
        nao_vinculados_alunos=nao_vinculados_alunos, 
        aulas=lista_de_aula,
        aluno_aula=aluno_aula,
        chamada=chamada
    )

#remove uma disciplina
@app.route("/remover_disciplina/<int:id>")
@login_required
def remover_disciplina(id):

    p = Professor.get(Professor.id == session["user_id"])

    d = Disciplina.get(Disciplina.id == id, Disciplina.professor == p)

    for ad in AlunoDisciplina.select().where(AlunoDisciplina.disciplina == d):
        ad.delete_instance()

    for aa in AlunoAula.select().where(AlunoAula.disciplina == d):
        aa.delete_instance()

    d.delete_instance()

    return redirect(url_for("index"))

#cadastrar uma nova disciplina
@app.route("/form_add_disciplinas", methods=['GET', 'POST'])
@login_required
def form_add_disciplinas():

    if request.method == 'POST':

        p = Professor.get(Professor.id == session["user_id"])

        d = Disciplina.create(nome=request.form["nome"],
                                peso_prova=request.form["peso_prova"], 
                                peso_trabalho=request.form["peso_trabalho"], 
                                quantidade_provas=request.form["quantidade_provas"], 
                                quantidade_trabalhos=request.form["quantidade_trabalhos"], 
                                professor=p)

        return redirect(url_for("index"))

    else:

        return render_template("form_add_disciplinas.html")

@app.route("/vincular_aluno", methods=['POST'])
@login_required
def vincular_aluno():

    disciplina_id = request.form.get('disciplina_id', None)

    aluno_id = request.form.get('aluno_id', None)

    if not aluno_id:
        return redirect(url_for("ver_disciplina", id=disciplina_id))

    aluno = Aluno.get(Aluno.id == aluno_id)

    p = Professor.get(Professor.id == session["user_id"])

    disciplina = Disciplina.get(Disciplina.id == disciplina_id, Disciplina.professor == p)

    try:
        AlunoDisciplina.get(AlunoDisciplina.aluno == aluno, AlunoDisciplina.disciplina == disciplina)
    except:
        AlunoDisciplina.create(aluno=aluno, disciplina=disciplina)

    return redirect(url_for("ver_disciplina", id=disciplina_id))